package cashpointer.mobile.support;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import cashpointer.mobile.R;
import cashpointer.mobile.dao.DaoModel.Countries;
import cashpointer.mobile.dao.DaoModel.Regions;
import cashpointer.mobile.service.UpdateService;

public class Functions {
	
	//private static String TAG = "Functions";
	
	/**
	 * Funkcja wspomagajaca czytanie strony.
	 * @param address
	 * @return
	 * @throws Exception
	 */
	public static String readSite(String address) throws Exception {
		try {
			// Ustalenie adresu
			URI uriAddress = new URI(address);
			URL urlAddress = null;
			try {
				urlAddress = uriAddress.toURL();

				URLConnection connection = null;
				try {
					// Nawiazanie polaczenia
					connection = urlAddress.openConnection();
					connection.connect();
					
					// Przygotowanie do czytania strony
					InputStream inputStream = connection.getInputStream();  
					BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
					StringBuffer sb = new StringBuffer();
					if (inputStream == null) {
						// Logi
						//Log.e(TAG, "Nie nawiazano polaczenia z serwerem!");
						throw new Exception("Nie nawiazano polaczenia z serwerem!");
					}
					
					// Czytanie strony
					String line = null;
					while((line = reader.readLine()) != null) {
						sb.append(line);
						// Logi
						//Log.i(TAG, line);
					}
					
					// Zwrocenie zawartosci strony
					return sb.toString();
				} catch (IOException ioe) {
					// Logi
					//Log.e(TAG, "Nastapil blad podczas pobierania danych! " + ioe.getMessage());
					throw new Exception("Nastapil blad podczas pobierania danych!");
				}
			} catch (MalformedURLException murle) {
				// Logi
				//Log.e(TAG, "Niepoprawny adres serwera! " + murle.getMessage());
				throw new Exception("Niepoprawny adres serwera!");
			}
		} catch (URISyntaxException urise) {
			// Logi
			//Log.e(TAG, "Niepoprawny adres serwera! " + urise.getMessage());
			throw new Exception("Niepoprawny adres serwera!");
		}
	}
	
	/**
	 * Funkcja upraszcza napis podany w argumencie. Usuwa z niego wszystkie polskie znaki.
	 * @param city
	 * @return
	 */
	public static String makeSimple(String arg) {
		if (arg != null) {
			String simpleName = makePolish(arg);
			
			// Male znaki
			simpleName = simpleName.replaceAll("ę", "e");
			simpleName = simpleName.replaceAll("ó", "o");
			simpleName = simpleName.replaceAll("ą", "a");
			simpleName = simpleName.replaceAll("ś", "s");
			simpleName = simpleName.replaceAll("ł", "l");
			simpleName = simpleName.replaceAll("ź", "z");
			simpleName = simpleName.replaceAll("ż", "z");
			simpleName = simpleName.replaceAll("ć", "c");
			simpleName = simpleName.replaceAll("ń", "n");
			
			// Duze znaki
			simpleName = simpleName.replaceAll("Ę", "E");
			simpleName = simpleName.replaceAll("Ó", "O");
			simpleName = simpleName.replaceAll("Ą", "A");
			simpleName = simpleName.replaceAll("Ś", "S");
			simpleName = simpleName.replaceAll("Ł", "L");
			simpleName = simpleName.replaceAll("Ź", "Z");
			simpleName = simpleName.replaceAll("Ż", "Z");
			simpleName = simpleName.replaceAll("Ć", "C");
			simpleName = simpleName.replaceAll("Ń", "N");
			
			return simpleName;
		}
		
		return null;
	}
	
	/**
	 * Funkcja usuwajaca wszystkie znaki nie bedace w zbiorze.
	 * @param arg
	 * @return
	 */
	public static String makePolish(String arg) {
		if (arg != null) {
			return arg.replaceAll("[^Q^W^E^R^T^Y^U^I^O^P^A^S^D^F^G^H^J^K^L^Z^X^C^V^B^N^M^Ę^Ó^Ą^Ś^Ł^Ż^Ź^Ć^Ń^q^w^e^r^t^y^u^i^o^p^a^s^d^f^g^h^j^k^l^z^x^c^v^b^n^m^ę^ó^ą^ś^ł^ż^ź^ć^ń\\s\\-\\d]", "");
		}
		
		return null;
	}
    
    /**
     * Funkcja zwraca polozenie wybranego wojewodztwa w cursorze.
     * @param selectedId Id wojewodztwa
     * @param cursor
     * @return
     */
    public static int getRegionPosision(int selectedId, Cursor cursor) {
    	// Pozycja
    	int posision = 0;
    	
    	// Przegladanie kursora
		if (cursor.moveToFirst()) {
	        int idColumn = cursor.getColumnIndex(Regions._ID);
	        do {
	        	// Pole "_ID"
				int cursorId = cursor.getInt(idColumn);
				
				// Sprawdzam czy id sie zgadza
				if (cursorId == selectedId) {
					return posision;
				}
				
				posision++;
	        } while (cursor.moveToNext());
	    }
		
		return 0;
    }
    
    /**
     * Funkcja zwraca polozenie wybranego powiatu w cursorze.
     * @param selectedId Id wojewodztwa
     * @param cursor
     * @return
     */
    public static int getCountryPosision(int selectedId, Cursor cursor) {
    	// Pozycja
    	int posision = 0;
    	
    	// Przegladanie kursora
		if (cursor.moveToFirst()) {
	        int idColumn = cursor.getColumnIndex(Countries._ID);
	        do {
	        	// Pole "_ID"
				int cursorId = cursor.getInt(idColumn);
				
				// Sprawdzam czy id sie zgadza
				if (cursorId == selectedId) {
					return posision;
				}
				
				posision++;
	        } while (cursor.moveToNext());
	    }
		
		return 0;
    }
    
	/**
	 * Funkcja zglaczajaca informacje o procesie aktualizacji dazy bankomatow.
	 * @param describe
	 */
	public static void notifyUpdateProcess(Context context, String describe) {
        // Ustawienie ikony i tekstu zachety dla powiadomienia
        int icon = R.drawable.main_icon;
        CharSequence tickerText = "Cashpointer Aktualizacja";
        
        // Ustalenie kiedy powiadomienie zostalo opublikowane
        long when = System.currentTimeMillis();
        
        // Ustawienie tresci powiadomienia
        CharSequence contentTitle = "Cashpointer Aktualizacja";
        CharSequence contentText = describe;
        
        // Budowanie powiadomienia
        Intent notificationIntent = new Intent(context, UpdateService.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
        Notification notification = new Notification(icon, tickerText, when);
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

        // Pobranie manadzera powiadomien i wyswietlenie powiadomienia
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);        
        notificationManager.notify(NotificationSupportManager.UPDATE_NOTIFY, notification);
    }
	
	/**
	 * Funkcja sprawdzajaca czy istnieje polaczenie z internetem.
	 * @return
	 * @throws Exception 
	 */
	public static boolean isConnectionEnabled(ConnectivityManager connectivityManager) {
		try {
			if (connectivityManager != null) {
				if (connectivityManager.getActiveNetworkInfo() != null) {
					NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
					if (networkInfo != null) {
						return networkInfo.isConnected();
					}
				} 	
			} 
		} catch (Exception e) {
			// Logi
			//Log.e(TAG, "Wystapil blad podczas sprawdzania polaczenia z internetem! " + e.getMessage());
		}
		
		return false;
	}
}
